import socket, sys, threading
from Tkinter import *
import partie
# dictionnaire des connexions clients
listeJoueur = {}  
# liste des parties en cours
listePartie=[]


class ThreadClient(threading.Thread):
    def __init__(self, conn):
        threading.Thread.__init__(self)
        self.connexion = conn
        self.verrou =threading.Lock()

    def run(self):
        # Dialogue avec le client :
        nom = self.getName()        # Chaque thread possede un nom
        self.verrou.acquire()
        while 1:
            msgClient = self.connexion.recv(1024)
    
            print "**%s** de %s" % (msgClient, nom)
            deb = msgClient.split(',')[0]
            if ("listePartiesEnAttente" in msgClient):
                listeJoueur[nom].send("nbPartiesEnAttente\n"+str(1)+"\n"+"ListePartiesEnAttente\npartie,2,2,1,nom")

            if (msgClient=="numPartieChoisie\n"):
                msg2=sock.recv(1024)
                self.njoueur=listPartie[int(msg2)].addjoueur(msg3,listeJoueur[nom])
                self.npartie=int(msg2)

                msg3=self.newsock.recv(1024)
                if (msg3=="numPartieChoisie"):
                    numP=self.newsock.recv(1024)
                    msg4=self.newsock.recv(1024)
                    if (msg4=="nomJoueur"):
                        nomJ=self.newsock.recv(1024)
                        #ajout du joueur dans la partie
                self.listePartie[numP].addjoueur(nomJ,self.newsock)
                self.app.verrou.release()
                break

            if msgClient.upper() == "FIN" or msgClient =="":
                break
            message = "%s> %s" % (nom, msgClient)
            print message
            # Faire suivre le message a tous les autres clients :
            for cle in listeJoueur:
                if cle != nom:      # ne pas le renvoyer a l'emetteur
                    listeJoueur[cle].send(message)
        # Fermeture de la connexion :
        self.connexion.close()       # couper la connexion cote  serveur
        del listeJoueur[nom]         # supprimer son entree dans le dictionnaire
        print "Client %s deconnecte." % nom
        # Le thread se termine ici








# Initialisation du serveur - Mise en place du socket :
if __name__=="__main__":
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    host="localhost"
    port=4000
    if len(sys.argv)<2:
        print "default listen port : %d"%port
        print "default localhost : %s"%host
    elif len(sys.argv)==2:
        if len(sys.argv[1])>5:
            host = sys.argv[1]
            print "localhost given : %s"%host
        else:       
            port = int(sys.argv[1])
            print "listened port : %d"%port
    else:
        if len(sys.argv[1])>len(sys.argv[2]):
            host = sys.argv[1]
            port = int(sys.argv[2])
        else:
            host = sys.argv[2]
            port = int(sys.argv[1])
    
        print "host given: %s"%host
        print "listened port: %d"%port

    try:
        mySocket.bind((host,port))
    except socket.error:
        print "La liaison du socket a l'adresse choisie a echoue."
        sys.exit()
    print "Serveur pret, en attente de requetes ..."
    mySocket.listen(15)
# Attente et prise en charge des connexions demandees par les clients :         
    while 1:
        connexion, adresse = mySocket.accept()
    # Creer un nouvel objet thread pour gerer la connexion :
        th = ThreadClient(connexion)
        th.start()
    # Memoriser la connexion dans le dictionnaire :
        it = th.getName()        # identifiant du thread
        listeJoueur[it] = connexion
        print "Client %s connecte, adresse IP %s, port %s." %\
            (it, adresse[0], adresse[1])
    # Dialogue avec le client :
        connexion.send("Vous etes connecte. Envoyez vos messages.")

